import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
#补充一段可以识别中文的代码
import tkinter as tk
from tkinter import font
#导入中文库
import matplotlib.pyplot as plt
import matplotlib as  mpl

# 设置中文字体
mpl.rcParams["font.sans-serif"] = ["SimHei"]  # 使用黑体
mpl.rcParams["axes.unicode_minus"] = False  # 正常显示负号

#加载数据集：
digits = load_digits()
X = digits.data  # 特征数据
y = digits.target  # 标签
print(f"数据集的形状：{X.shape}")  # 每个样本有64个特征（8x8像素的图像）
#数据预处理：
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
#选择主成分数量：
# 计算每个主成分的方差贡献率
pca = PCA(n_components=None)  # 初始设为None，计算所有主成分
pca.fit(X_scaled)
explained_variance_ratio = pca.explained_variance_ratio_  # 每个主成分的方差贡献率

# 绘制方差贡献率曲线，以选择合适的主成分数量
plt.figure(figsize=(8, 6))
plt.plot(range(1, len(explained_variance_ratio)+1), explained_variance_ratio, 'bo-', linewidth=2)
plt.title('方差贡献率')
plt.xlabel('主成分编号')
plt.ylabel('方差贡献率')
plt.show()
#应用PCA：
n_components = 10  # 假设我们选择保留前10个主成分
pca = PCA(n_components=n_components)
X_pca = pca.fit_transform(X_scaled)
print(f"降维后的数据形状：{X_pca.shape}")
#可视化降维后的数据：
plt.figure(figsize=(8, 6))
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap='viridis', edgecolor='k', s=20)
plt.colorbar()
plt.title('降维后的数据（前两个主成分）')
plt.xlabel('主成分1')
plt.ylabel('主成分2')
plt.show()